package com.gzc.just.play.last.war.sceneserver.ai;

import com.gzc.just.play.last.war.sceneserver.gameobject.unit.GameUnit;

/**
 * 行为树节点基类 - 所有行为树节点的父类
 * 
 * 映射自C++ BehaviorTreeNode
 * 支持Selector、Sequence、Action等多种行为节点
 * 
 * @author AI编程助手
 * @version 1.0
 */
public abstract class BehaviorNode {
    
    /**
     * 节点类型
     */
    public enum NodeType {
        /**
         * 选择器 - 执行第一个成功的子节点
         */
        SELECTOR,
        
        /**
         * 序列器 - 依次执行所有子节点，任何一个失败则停止
         */
        SEQUENCE,
        
        /**
         * 并行器 - 同时执行所有子节点
         */
        PARALLEL,
        
        /**
         * 动作节点 - 执行具体的行为动作
         */
        ACTION,
        
        /**
         * 条件节点 - 条件判断
         */
        CONDITION
    }
    
    /**
     * 节点执行结果
     */
    public enum Result {
        /**
         * 成功
         */
        SUCCESS,
        
        /**
         * 失败
         */
        FAILURE,
        
        /**
         * 运行中
         */
        RUNNING
    }
    
    protected String name;
    protected NodeType nodeType;
    protected Result lastResult = Result.FAILURE;
    
    /**
     * 构造函数
     * 
     * @param name 节点名称
     * @param nodeType 节点类型
     */
    public BehaviorNode(String name, NodeType nodeType) {
        this.name = name;
        this.nodeType = nodeType;
    }
    
    /**
     * 执行节点逻辑
     * 
     * @param unit 执行该节点的游戏单位
     * @param deltaTime 时间差（毫秒）
     * @return 执行结果
     */
    public abstract Result tick(GameUnit unit, long deltaTime);
    
    /**
     * 初始化节点
     * 
     * @param unit 游戏单位
     */
    public void initialize(GameUnit unit) {
        this.lastResult = Result.FAILURE;
    }
    
    /**
     * 中止节点执行
     * 
     * @param unit 游戏单位
     */
    public void terminate(GameUnit unit) {
        this.lastResult = Result.FAILURE;
    }
    
    /**
     * 获取节点名称
     * 
     * @return 节点名称
     */
    public String getName() {
        return name;
    }
    
    /**
     * 获取节点类型
     * 
     * @return 节点类型
     */
    public NodeType getNodeType() {
        return nodeType;
    }
    
    /**
     * 获取最后的执行结果
     * 
     * @return 执行结果
     */
    public Result getLastResult() {
        return lastResult;
    }
}
